專案目標:建立一個高隱私、零月租、多日曆聚合(Multi-Calendar Flattening)且掛鉤櫃檯現場繳費確認(Asynchronous Confirmation)的物理治療預約系統。
實做混合雲(Hybrid Cloud)預約系統之核心挑戰,在於跨越外網安全邊界(Public Ingress)與內網隱私數據(Private Local Core)的雙向通訊。系統必須在不暴露診所實體 IP、不進行路由器虛擬伺服器(Port Forwarding)設定的安全前提下,確保雲端預約事件(Cal.com Webhook)能以毫秒級延遲(Latency < 100ms)送達本地自動化引擎(n8n),並在本地維持一個具備生存時間(TTL, Time-to-Live)的異步繳費狀態機。
| 元件名稱 (Component) | 建議選型 (Tech Stack) | 信賴層級 (SRI Tier) | 部署位置 (Location) |
|---|---|---|---|
| 預約前端門戶 | Cal.com (Cloud Individual) | Tier A (SOTA 級排程) | 雲端 (SaaS) |
| 邊界安全安全隧道 | Cloudflare Tunnel (Cloudflared) | Tier A (零信任安全標準) | 雲端 + 本地雙向 |
| 自動化狀態機引擎 | n8n (Self-hosted Community) | Tier A (最強開源工作流) | 本地 (Docker) |
| 狀態持久化層 | PostgreSQL / SQLite | Tier A (結構化 ACID 標準) | 本地 (Docker) |
| 通知關閘 | LINE Notify / LINE Bot API | Tier B (台灣在地主流) | 雲端 API 呼叫 |
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: pt_clinic_db
restart: always
environment:
POSTGRES_USER: clinic_admin
POSTGRES_PASSWORD: SecurePassword2026!
POSTGRES_DB: clinic_booking
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
- clinic_network
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: pt_clinic_n8n
restart: always
ports:
- "5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=clinic_booking
- DB_POSTGRESDB_USER=clinic_admin
- DB_POSTGRESDB_PASSWORD=SecurePassword2026!
- N8N_SECURE_COOKIE=false
volumes:
- ./n8n_data:/home/node/.n8n
networks:
- clinic_network
depends_on:
- postgres
cloudflared:
image: cloudflare/cloudflared:latest
container_name: pt_clinic_tunnel
restart: always
command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}
networks:
- clinic_network
depends_on:
- n8n
networks:
clinic_network:
driver: bridge
監聽 Cal.com Webhook 節點路徑 /v1/cal-webhook。將 bookingId、患者個資與時間寫入本地 postgres,並初始化狀態為 PENDING_PAYMENT。
每 5 分鐘由 Cron 觸發,撈取建立超過 30 分鐘且仍為 PENDING_PAYMENT 的案件,自動向 Cal.com API 發送 PATCH /bookings/{id} 帶入 {"status": "REJECTED"},解鎖行事曆時段。
櫃檯人員確認收錢後,透過前端介面或 Google Sheets 變更狀態,觸發 n8n 向 Cal.com 發送核准請求 /confirm。此時 Cal.com 將自動同步至博群復健診所行事曆,完成狀態閉環並發送 LINE 門診導引通知。